package client

import (
	"encoding/json"
	"fmt"
	"net"
	"time"
)

const (
	HAL_SOCKET_PATH = "/tmp/hal"
	BUFFER_SIZE     = 4096
)

// HAL请求结构
type HALRequest struct {
	ID        string                 `json:"id"`
	Method    string                 `json:"method"`
	Params    map[string]interface{} `json:"params"`
	Timestamp int64                  `json:"timestamp"`
}

// HAL响应结构
type HALResponse struct {
	ID      string                 `json:"id"`
	Status  string                 `json:"status"`
	Result  map[string]interface{} `json:"result,omitempty"`
	Error   *HALError              `json:"error,omitempty"`
	Timestamp int64                `json:"timestamp"`
}

// HAL错误结构
type HALError struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

// HAL客户端结构
type HALClient struct {
	socketPath string
	conn       net.Conn
}

// 创建新的HAL客户端
func NewHALClient(socketPath string) *HALClient {
	return &HALClient{
		socketPath: socketPath,
	}
}

// 连接到HAL服务器
func (c *HALClient) Connect() error {
	conn, err := net.Dial("unix", c.socketPath)
	if err != nil {
		return fmt.Errorf("连接HAL服务器失败: %v", err)
	}
	c.conn = conn
	return nil
}

// 断开连接
func (c *HALClient) Disconnect() error {
	if c.conn != nil {
		return c.conn.Close()
	}
	return nil
}

// 发送请求并接收响应
func (c *HALClient) Request(method string, params map[string]interface{}) (*HALResponse, error) {
	if c.conn == nil {
		return nil, fmt.Errorf("未连接到HAL服务器")
	}

	// 创建请求
	req := HALRequest{
		ID:        fmt.Sprintf("req_%d", time.Now().UnixNano()),
		Method:    method,
		Params:    params,
		Timestamp: time.Now().Unix(),
	}

	// 序列化请求
	reqData, err := json.Marshal(req)
	if err != nil {
		return nil, fmt.Errorf("序列化请求失败: %v", err)
	}

	// 发送请求
	_, err = c.conn.Write(reqData)
	if err != nil {
		return nil, fmt.Errorf("发送请求失败: %v", err)
	}

	// 接收响应
	buffer := make([]byte, BUFFER_SIZE)
	n, err := c.conn.Read(buffer)
	if err != nil {
		return nil, fmt.Errorf("接收响应失败: %v", err)
	}

	// 解析响应
	var resp HALResponse
	err = json.Unmarshal(buffer[:n], &resp)
	if err != nil {
		return nil, fmt.Errorf("解析响应失败: %v", err)
	}

	return &resp, nil
}

// 检查连接状态
func (c *HALClient) IsConnected() bool {
	return c.conn != nil
}